<?php defined('SYSPATH') or die('No direct script access.');

/**
 *Класс для работы с корзиной(создание корзины, добавление товара)
 *
 * @author knizera
 * @author Lukyanets M.V. <3ch023a@gmail.com>
 */
class Model_Cart
{
    protected $api; 
    
    public function __construct($config = null)
    {
        if (!is_object($config))
            $config = Kohana::$config->load('site');
        $this->api = Model_Api::factory($config);
    }
  

    /***
     *Add to Cart
     * @param string $asin// ID 
     * @param integer $qantity// ID 
     * @return array $answ // массив продуктов из корзины 
    */
    public function add($asin, $quantity = 1) 
    {
        //$debug = true;
        $message=0;
        $user_id = null;
        $cId = null;
        $auth = Auth::instance();
        if ($auth->logged_in())   // если пользователь авторизован
        {
            $user = $auth->get_user(); //получаем данные о авторизованном пользователе
            $user_id = $user->id;
            $query = DB::select('c_id')->from('carts')
                    ->where('user_id', '=', $user->id)
                    ->execute()->as_array();//находим корзину соответствующую данному пользователю
            
            if (isset($query[0]['c_id']))
                $cId = $query[0]['c_id'];
        } 
        else        
            $cId = Cookie::get('c_id');//проверяем нет ли идентификатора корзины в куках        

        if ($cId == null) // если корзины нет 
        {
            $answ = $this->api->createCart($asin, $quantity); // cоздаем корзину
            if (isset($answ['CartId']))  // если корзина создалась
            {
                // пишем в бд корзинy
                list($insert_id, $total_rows_affected) = DB::insert('carts', 
                        array('cart_id', 'hmac', 'user_id'))
                    ->values(array($answ['CartId'], $answ['HMAC'], $user_id))
                    ->execute();
                // добавляем текущий айтем
                //echo "xxvxcxxxxxx".$answ['CartItemId'];
                //print_r($answ);
//                echo "<script>alert(".$quantity."products was added)</script>";
//                if ($quantity != $answ['Quantity']) 
//                {
//                    if ($quantity > $answ['Quantity'])
//                        $message = $answ['Quantity'];
//                    $quantity = $answ['Quantity'];
//                }
                $quantity = $answ['Quantity'];
                
                DB::insert('items', array('c_id', 'asin', 'quantity', 'cart_item_id'))
                        ->values(array(
                            $insert_id, $asin, $quantity, $answ['CartItemId']))
                        ->execute();
               
                if (!$auth->logged_in()) // если юзер не зареган связываем его с корзиной через куки, если зареган то в бд прописано юзер айди
                    Cookie::set('c_id', $insert_id, Date::YEAR);
                
                // возвращаем текущий айтем
                //$tmp = $this->api->getCart($answ['CartId'], $answ['HMAC']);
                //echo 'Cart ctreated - '.$tmp['Title'];
                //return $tmp;
                
            }
        } 
        else  // если корзина есть
        {
            if($auth->logged_in())
            {
                $cId2 = Cookie::get('c_id');
                if ($cId2 != null)// проверяем нет ли двух корзин одновременно
                {
                    $this->TwoCartInOne($cId2, $cId);
                    Cookie::delete('c_id');
                    //echo "222222";
                }   
            }
             // извлекаем амазонайди и шмак корзины
            $query = DB::select('cart_id', 'hmac')->from('carts')
                    ->where('c_id', '=', $cId)->execute()->as_array();
            // добавляем в корзину амазона новый айтем
            $answ = $this->api->addCart($asin, $query[0]['cart_id'], 
                    $query[0]['hmac'], $quantity);
            //echo "3333333";
            if (!isset($answ['CartId']))//если корзина не "живая"
            {
                $answ = $this->NewCart($cId); //оживляем
                if (isset($answ['CartId']))                
                    $answ = $this->api->addCart($asin, $answ['CartId'], 
                            $answ['HMAC'], $quantity); //добавляем в оживленную корзину
                //echo "44444444";
            }
            //echo "sddsdsssds";
            //$t=array();
            // добавляем текущий айтем в бд
            $countItems = DB::select()->from('items')
                    ->where('c_id','=', $cId)
                    ->and_where('asin','=', $asin)
                    ->execute()->count();
            
            if (!$countItems)//если нет, добавляем
            {
                if (isset($answ['Item'][0]['ASIN']))
                    for ($i = 0; $i < count($answ['Item']); $i++)
                    {
                        if ($answ['Item'][$i]['ASIN'] == $asin)
                        {//находим идетификатор элемента соответствующий данному продукту
                            $cartItemId = $answ['Item'][$i]['CartItemId'];
//                            if($quantity!=$answ['Item'][$i]['Quantity'])
//                            {
////                                if ($quantity > $answ['Item'][$i]['Quantity'])
////                                    $message = $answ['Item'][$i]['Quantity'];
//                                $quantity = $answ['Item'][$i]['Quantity'];
//                                
//                            }
                            $quantity = $answ['Item'][$i]['Quantity'];
                            break;
                        }
                    }
                elseif (isset($answ['ASIN']) && $answ['ASIN'] == $asin)//находим идетификатор элемента соответствующий данному продукту
                {
                    $cartItemId = $answ['CartItemId'];
                    /* if($quantity!=$answ['Quantity'])
                    {
//                        if ($quantity > $answ['Quantity'])
//                            $message = $answ['Quantity'];
                        $quantity = $answ['Quantity'];      
                    }*/
                    $quantity = $answ['Quantity']; 
                }
                if(isset($cartItemId))
                    DB::insert('items', array(
                        'c_id', 'asin', 'quantity', 'cart_item_id'))
                        ->values(array($cId, $asin, $quantity, $cartItemId))
                        ->execute();
                
            //print_r($tb);
                
            }
            else// если есть, изменяем колличество
            {
                if (isset($answ['Item'][0]['ASIN']))
                {
                    for ($i = 0; $i < count($answ['Item']); $i++)                    
                        if ($answ['Item'][$i]['ASIN'] == $asin)
                            $quantity = $answ['Item'][$i]['Quantity'];         
                }
                elseif ($answ['ASIN'] == $asin)//находим идетификатор элемента соответствующий данному продукту
                {
                    //if($quantity!=$answ['Quantity'])
                    //{
//                        if ($quantity > $answ['Quantity'])
//                            $message = $answ['Quantity'];
                    $quantity = $answ['Quantity'];
                        
//                    }
                }
                DB::update('items')
                        ->set(array('quantity' => $quantity))
                        ->where('asin', '=', $asin)
                        ->and_where('c_id', '=', $cId)->execute(); //
                //print_r($answ);
                
                //print_r($t[0]['COUNT("*")']);
            }
          //  DB::insert('items', array('c_id', 'asin','quantity'))
                   // ->values(array($cId, $asin, $quantity))->execute();
            // возвращаем содержимое корзины
            return $quantity;
            //return $message;
        }
    }
    
    public function delItem($asin) // NOTE: need comments
    {
        $user_id = null;
        $cId=null;
        $auth = Auth::instance();
        if ($auth->logged_in())   // если пользователь авторизован
        {
            $user = $auth->get_user();//получаем данные о авторизованном пользователе
            
            $user_id = $user->id;
            $query = DB::select('c_id')->from('carts')->where('user_id', '=',
                    $user_id)->execute()->as_array();//находим корзину соответствующую данному пользователю
            if (isset($query[0]['c_id']))
                $cId = $query[0]['c_id'];
            
        } 
        else        
            $cId = Cookie::get('c_id');//проверяем нет ли идентификатора корзины в куках
        
        if ($cId != null) // если корзинa  есть
        {
            $query = DB::select('cart_id', 'hmac')
                    ->from('carts')->where('c_id', '=', $cId)->execute()->as_array();
            // добавляем в корзину амазона новый айтем
            //print_r($query);
            $cartItemId = DB::select('cart_item_id')->from('items')
                    ->where('asin','=', $asin)->and_where('c_id','=', $cId)
                    ->execute()->as_array();
    //print_r($cartItemId);
            $answ = $this->api->delItem($asin, $query[0]['cart_id'], 
                    $query[0]['hmac'],$cartItemId[0]['cart_item_id']);
            DB::delete('items')->where('asin','=', $asin)->and_where('c_id','=', $cId)->execute();
            $t=DB::select()->from('items')->where('c_id', '=', $cId)->execute()->count();
            if($t==0)DB::delete('carts')->where('c_id','=', $cId)->execute();
            
           // print_r($answ);
        }
        else // обработать
        {
            
        }
    }
    
    /***
     * Оживление корзины
     */
   
    public function NewCart($cId) 
    {
        //$cId=1;
        //находим товары добавленные этим пользователем
         $query = DB::select('asin','quantity')->from('items')
                        ->where('c_id', '=', $cId)->execute()->as_array();
         //print_r($query);
         if(!isset($query[0]['asin']))
         {
             return array();
         }
         $answ = $this->api->createCart($query[0]['asin'],$query[0]['quantity']);//создаем новую корзину

         if (isset($answ['CartId']))//если создало успешно
         {
             for ($i = 1; $i < count($query); $i++) 
             {
                 $this->api->addCart($query[$i]['asin'], $answ['CartId'],
                         $answ['HMAC'],$query[$i]['quantity']);
             }
            $query = DB::update()->table('carts')->set(
                            array('cart_id' => $answ['CartId'],
                                'hmac' => $answ['HMAC']
                                 )
                            )->where('c_id', '=', $cId);//обновляем идинтификатор корзины в БД
            $query->execute();
           // echo "OK";
         }
         return $answ;
    }
    
    // метод для сливания двух корзин
    public function TwoCartInOne($cId1,$cId2) //cId2 тот который с пользователем
    {
        $query1 = DB::select('asin','quantity')->from('items')
                        ->where('c_id', '=', $cId1)->execute()->as_array();//выбираем данные из первой корзины
        $query2 = DB::select('asin','quantity')->from('items')
                        ->where('c_id', '=', $cId2)->execute()->as_array();//выбираем данные из второй корзины
        $items=array();//сливаем товары в один массив
        $j=0;
        for ($i = 0; $i < count($query1); $i++)
        {
            $items[$j]['asin'] = $query1[$i]['asin'];
            $items[$j]['quantity'] = $query1[$i]['quantity'];
            $j++;
        }
        for ($i = 0; $i < count($query2); $i++)
        {
            $items[$j]['asin'] = $query2[$i]['asin'];
            $items[$j]['quantity'] = $query2[$i]['quantity'];
            $j++;
        }
        if(count($items)!=0)
        {
            $answ = $this->api->createCart($items[0]['asin'],$items[0]['quantity']);

            if (isset($answ['CartId']))//если создало успешно
            {
                for ($i = 1; $i < count($items); $i++)
                {
                    $this->api->addCart($items[$i]['asin'], $answ['CartId'], 
                        $answ['HMAC'], $items[$i]['quantity']);
                }//добавляем в новую корзину
                DB::update()->table('carts')->set(
                            array('cart_id' => $answ['CartId'],
                                'hmac' => $answ['HMAC']
                            )
                    )->where('c_id', '=', $cId2)->execute(); //обновляем идинтификатор корзины в БД
     
                DB::update()->table('items')->set(
                            array('c_id' => $cId2
                            )
                    )->where('c_id', '=', $cId1)->execute(); //заменяем идинтификатор корзины в БД

            //удаляем информацию о корзине не авторизованного юзера
                DB::delete()->table('carts')->where('c_id', '=', $cId1); 
                return $answ;
            }
        }
    }
    
    
    
    /***
     * get Items from cart
     */
    public function getItems() 
    {
        $cId = null;
        $user_id = null;

        $answ = array(); //вернем это если корзина пуста

        $auth = Auth::instance();
        if ($auth->logged_in())
        {   
            $user_id = $auth->get_user()->id;
            $query = DB::select('c_id')->from('carts')->where('user_id', '=', 
                    $user_id)->execute()->as_array();//находим корзину соответствующую данному пользователю
            if (isset($query[0]['c_id']))//если есть корзина в бд
            {
                $cId = $query[0]['c_id'];
                $cId2 = Cookie::get('c_id');
                
                if ($cId2 != null)// проверяем нет ли двух корзин одновременно
                {
                    $this->TwoCartInOne($cId2, $cId);
                    
                    Cookie::delete('c_id');
                    //echo "222222";
                }
            }
            else 
            {
                $cId2 = Cookie::get('c_id');
                
                if ($cId2 != null)// проверяем нет ли двух корзин одновременно
                {
                    $cId=$cId2;
                    DB::update()->table('carts')->set(
                            array('user_id' => $user_id
                                
                            )
                    )->where('c_id', '=', $cId)->execute(); //обновляем идинтификатор корзины в БД
                    
                    Cookie::delete('c_id');
                    //echo "222222";
                }
            }
 
            
        } 
        else
        {
            $cId = Cookie::get('c_id');
        }
        if ($cId != null)
        {
            // извлекаем амазонайди и шмак корзины
            $query = DB::select('cart_id', 'hmac')
                    ->from('carts')->where('c_id', '=', $cId)->execute();
            // возвращаем содержимое корзины
            //echo '<br>!!!<br>';
            //exit;
            $answ=$this->api->getCartFull($query->get('cart_id'), $query->get('hmac'));
            if (!isset($answ['Total']))
            {
                $answ=$this->NewCart($cId);
                if (isset($answ['CartId']))
                {
                                
                    $answ = $this->api->getCartFull($answ['CartId'], $answ['HMAC']);
                }
            
            }
            return $answ;
        }

        
        
        //return $answ;    
    }

}
